let hx = require("hbuilderx");

/**
 * 识别路径,打开文件
 */
function activate(context) {
	let disposable = hx.commands.registerCommand('extension.open_file_by_uri', () => {
		// 没有项目打开的时候,无回调.需通过定时器判断
		let timer = setTimeout(()=>{
			hx.window.showErrorMessage("为确保快速识别路径, 请至少打开项目的任意一个文件").then();
		},500)
		
		// 当前项目
		let editorPromise = hx.window.getActiveTextEditor();
		editorPromise.then(editor => {
			timer && clearTimeout(timer) // 清除定时器 (一般耗时70ms)
			// console.log("当前项目 --> ", editor);
			
			let word = editor.document.getText(editor.selection);
			if (word) {
				// 选中的文本
				// console.log("选中的文本 --> ", word)
				openFileByUri(editor, word)
			} else{
				// 读取剪切板
				let textPromise = hx.env.clipboard.readText();
				textPromise.then(text => {
					// console.log("剪切板内容 --> ", text)
					openFileByUri(editor, text)
				})
			}
		})
		
		// 识别路径,打开文件
		async function openFileByUri(editor, text){
			if(text) text = text.trim().replace(/[\r\n]/g,"") // 去掉前后空格和所有回车符
			if(!text) return;
			
			let folder = editor.document.workspaceFolder
			// console.log("当前项目空间 --> ", folder);
			
			// 目标文件的相对路径
			let pagePath;
			if (folder.nature == "UniApp_Vue") { // 项目类型: UniApp_Vue,Web,App,Wap2App,Extension,Unkown
				// uni-app的页面路径: "xx/pages/xx" || "/pages/xx" || "pages/xx" (特殊情况"pages/xx/pages/xx", "pages/xx-pages/xx")
				if (text.indexOf("pages/")!=-1) {
					pagePath = text.substr(text.indexOf("pages/")) // 最终截取为 "/pages/xx"
				}
			}
			// 直接拼接路径
			if(!pagePath) pagePath = text
			
			// 去掉"?"后面的参数
			pagePath = pagePath.split("?")[0]
			
			// 打开文件
			let curUri = folder.uri // 当前项目uri: {path: "/系统盘:/xx/项目名"}
			if(pagePath.indexOf("./") == 0 || pagePath.indexOf("../") == 0){
				// 相对路径 "./"或"../"开头
				let curFilePath = editor.document.uri.path // 当前文件uri: {path: "/系统盘:/xx/项目名/1xx/2xx"}
				curUri.path = curFilePath.substring(0, curFilePath.lastIndexOf("/")+1) + pagePath // '/系统盘:/xx/项目名/1xx/' + pagePath
			}else{
				// "@"开头的路径
				let startA = false
				if(pagePath.indexOf("@") == 0) {
					pagePath = pagePath.substr(1) // 别名路径
					startA = true
				}
				if(pagePath.indexOf("~@") == 0){
					pagePath = pagePath.substr(2) // vue项目的图片资源路径
					startA = true
				}
				if (startA && folder.nature == "Web") pagePath = "src" + pagePath // vue项目@的别名是src (其他别名路径无法识别打开)
				// 需以"/"开头
				if(pagePath.indexOf("/") != 0) pagePath = "/" + pagePath
				// 设置目标文件uri
				curUri.path = curUri.path + pagePath // '/系统盘:/xx/项目名' + pagePath
			}
			let doc;
			let fileName = pagePath.substr(pagePath.lastIndexOf("/")+1) // 文件名
			if(fileName.indexOf(".") != -1){
				// 如果路径已包含后缀,则直接打开
				let documentPromise = hx.workspace.openTextDocument(curUri); // 打开目标文件
				doc = await documentPromise.then()
				// console.log("直接打开文件: " + curUri.path);
				if(!doc){
					// 图片的doc为null,不提示"文件不存在"
					let s = pagePath.substr(pagePath.lastIndexOf(".")+1)
					if(["bmp","jpg","png","tif","gif","svg"].indexOf(s) != -1) return
				}
			}else{
				// 如果路径没有后缀,则补齐后缀打开
				let suffix = [".vue", ".js", ".css", ".html", ".ts", "/index.vue", "/index.js", "/index.css", "/index.html", "/index.ts"]
				let path = curUri.path // 没有后缀的路径 '/系统盘:/xx/项目名/pages/xx'
				for (let s of suffix) {
					curUri.path = path + s // '/系统盘:/xx/项目名/pages/xx.vue'
					let documentPromise = hx.workspace.openTextDocument(curUri); // 打开目标文件
					doc = await documentPromise.then()
					// console.log("尝试打开文件: " + curUri.path);
					if(doc) break; // 打开之后跳出循环
				}
			}
			
			// 如果路径中间存在空格,尝试去掉空格再找一遍
			if(!doc && curUri.path.indexOf(" ") != -1){
				curUri.path = curUri.path.replace(/\s/g, "")
				let documentPromise = hx.workspace.openTextDocument(curUri); // 打开目标文件
				doc = await documentPromise.then()
			}
			
			// 文件不存在的提示
			if(!doc){
				let msg = '文件不存在: ' + pagePath
				if(msg.length > 100) msg = msg.substr(0, 100) + "..."
				if ((pagePath.indexOf("http://")!=-1||pagePath.indexOf("https://")!=-1)) {
					if(folder.nature == "UniApp_Vue"){
						msg += " (温馨提示: uni-app项目除了首页无法识别,其他页面都可识别)"
					}else{
						msg += " (温馨提示: 普通项目无法识别http路径)"
					}
				}
				hx.window.showErrorMessage(msg).then();
			}
		}
		
	});
	context.subscriptions.push(disposable);
}

// 插件卸载的时候触发
function deactivate(){}

module.exports = {
	activate,
	deactivate
}
